﻿/*
SINACOR - BMF&Bovespa
Arquivo: AlocacaoCoberturaTermo.cs
Criado em: 27-nov-2009 11:59:13
Arquiteto Responsável: RAMelo.7Comm
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Linq.Expressions;
using System.ComponentModel;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Security.Authorization;
using Sinacor.Infra.Service.Validation.BusinessRules;
using Sinacor.Infra.Common.Validation;
using Sinacor.Servico.Bovespa.Alocacao.BusinessEntity;
using Sinacor.Servico.Bovespa.Alocacao.BusinessEntity.Enum;
using Sinacor.Servico.Bovespa.Operador.BusinessEntity;
using Sinacor.Servico.Bovespa.Operador.BusinessLogic;
using Sinacor.Servico.Bovespa.Parametro.BusinessLogic;
using Sinacor.Servico.Bovespa.Parametro.BusinessEntity;
using Sinacor.Servico.Bovespa.Alocacao.ResourceAccess;
using Sinacor.Servico.Bovespa.Titulo.BusinessLogic;
using Sinacor.Servico.Bovespa.Titulo.BusinessEntity;
using Sinacor.Servico.Bovespa.ManutencaoOrdens.BusinessLogic;
using Sinacor.Servico.Bovespa.ManutencaoOrdens.BusinessEntity;
using Sinacor.Servico.Bovespa.Cliente.BusinessLogic;
using Sinacor.Servico.Bovespa.Cliente.BusinessEntity;
using Sinacor.Servico.Bovespa.Ordens.BusinessLogic;
using Sinacor.Servico.Bovespa.Ordens.BusinessEntity;
using Sinacor.Servico.Bovespa.Movimento.BusinessLogic;
using Sinacor.Servico.Bovespa.Movimento.BusinessEntity;
using Sinacor.Servico.Bovespa.Movimento.BusinessEntity.Enum;

namespace Sinacor.Servico.Bovespa.Alocacao.BusinessLogic
{
    /// <summary>
    /// Class AlocacaoCarteiraVendaDescoberta 
    /// </summary>
    public class AlocacaoCarteiraVendaDescoberta : BaseBusinessLogic
    {
        private List<BusinessEntity.LoteOrdem> _lotesOrdensVendaDescoberta;

        public AlocacaoCarteiraVendaDescoberta(){}

        #region Métodos
        /// <summary>
        /// Aloca quantidade descoberta na carteira 219
        /// </summary>
        /// <param name="entityList"></param>
        public void AlocarCarteira219(ref BusinessEntity.VendaDescoberta entity)
        {
            if (entity.PosicaoCarteira219 > 0 && entity.QuantidadeNaoAlocada > 0)
            {                
                Decimal valor = (decimal)entity.QuantidadeNaoAlocada - entity.PosicaoCarteira219;                
                if (valor > 0)
                {
                    entity.AlocacaoCarteira219 = entity.PosicaoCarteira219;
                    entity.QuantidadeNaoAlocada = valor;
                }
                else if (valor == 0)
                {
                    entity.AlocacaoCarteira219 = entity.PosicaoCarteira219;
                    entity.QuantidadeNaoAlocada = 0;
                }
                else
                {
                    entity.AlocacaoCarteira219 = entity.QuantidadeDescoberta;
                    entity.QuantidadeNaoAlocada = 0;                    
                }
            }
        }

        /// <summary>
        /// Aloca quantidade descoberta na carteira 239
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public void AlocarCarteira239(ref BusinessEntity.VendaDescoberta entity)
        {
            if (entity.PosicaoCarteira239 > 0 && entity.QuantidadeNaoAlocada > 0)
            {
                Decimal valor = (decimal)entity.QuantidadeNaoAlocada - entity.PosicaoCarteira239;                
                if (valor > 0)
                {
                    entity.AlocacaoCarteira239 = entity.PosicaoCarteira239;
                    entity.QuantidadeNaoAlocada = valor;

                }
                else if (valor == 0)
                {
                    entity.AlocacaoCarteira239 = entity.PosicaoCarteira239;
                    entity.QuantidadeNaoAlocada = 0;
                }
                else
                {
                    entity.AlocacaoCarteira239 = entity.QuantidadeDescoberta;
                    entity.QuantidadeNaoAlocada = 0;
                }
            }
        }
       
        /// <summary>
        /// Aloca quantidade descoberta na carteira 274
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public void AlocarCarteira274(ref BusinessEntity.VendaDescoberta entity)
        {
            if (entity.PosicaoCarteira274 > 0 && entity.QuantidadeNaoAlocada > 0)
            {
                Decimal valor = (decimal)entity.QuantidadeNaoAlocada - entity.PosicaoCarteira274;                
                if (valor > 0)
                {
                    entity.AlocacaoCarteira274 = entity.PosicaoCarteira274;
                    entity.QuantidadeNaoAlocada = valor;
                }
                else if (valor == 0)
                {
                    entity.AlocacaoCarteira274 = entity.PosicaoCarteira274;
                    entity.PosicaoCarteira274 = 0;
                }
                else
                {
                    entity.AlocacaoCarteira274 = entity.QuantidadeDescoberta;
                    entity.QuantidadeNaoAlocada = 0;
                }
            }
        }

        /// <summary>
        /// Aloca quantidade descoberta na carteira 280
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public void AlocarCarteira280(ref BusinessEntity.VendaDescoberta entity)
        {
            if (entity.PosicaoCarteira280 > 0 && entity.QuantidadeNaoAlocada > 0)
            {
                Decimal valor = (decimal)entity.QuantidadeNaoAlocada - entity.PosicaoCarteira280;                
                if (valor > 0)
                {
                    entity.AlocacaoCarteira280 = entity.PosicaoCarteira280;
                    entity.QuantidadeNaoAlocada = valor;
                }
                else if (valor == 0)
                {
                    entity.AlocacaoCarteira280 = entity.PosicaoCarteira280;
                    entity.QuantidadeNaoAlocada = 0;
                }
                else
                {
                    entity.AlocacaoCarteira280 = entity.QuantidadeDescoberta;
                    entity.QuantidadeNaoAlocada = 0;
                }
            }
        }

        /// <summary>
        /// Distribui a quantidade descoberta na carteira 216 para outras carteiras que possuam saldo
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public void AlterarAlocacaoVendaDescoberta(BusinessEntity.VendaDescoberta entity)
        {
            if (entity != null)
            {
                this.ValidarEstadoMovimento();
                this.ValidarPermissaoAcesso();

                BusinessLogic.BusinessRuleValidation.ValidadorOrdemDistribuidaVendaDescoberta validarOrdem = new Sinacor.Servico.Bovespa.Alocacao.BusinessLogic.BusinessRuleValidation.ValidadorOrdemDistribuidaVendaDescoberta();
                validarOrdem.EntityToValidate = entity;

                BusinessRulesValidator validator = new BusinessRulesValidator();
                validator.AddValidation("validarOrdem", validarOrdem);
                validator.Validate();

                if (!(validarOrdem.GetErrors().Count > 0))
                {
                    Sinacor.Servico.Bovespa.Alocacao.BusinessEntity.Enum.SituacaoLoteOrdemVendaDescoberta situacaoOrdem = this.ObterSituacaoLoteOrdemVendaDescoberta(entity);
                    Bovespa.Ordens.BusinessLogic.LoteOrdem loteOrdem = new Sinacor.Servico.Bovespa.Ordens.BusinessLogic.LoteOrdem();
                    Bovespa.Ordens.BusinessEntity.LoteOrdem loteOrdemBE = null;
                    List<Bovespa.Ordens.BusinessEntity.LoteOrdem> loteOrdemBEList = new List<Sinacor.Servico.Bovespa.Ordens.BusinessEntity.LoteOrdem>();

                    foreach (BusinessEntity.LoteOrdem item in _lotesOrdensVendaDescoberta)
                    {
                        loteOrdemBE = new Sinacor.Servico.Bovespa.Ordens.BusinessEntity.LoteOrdem();
                        loteOrdemBE.NumeroConjunto = item.NumeroConjunto;
                        loteOrdemBE.DataPregao = item.DataPregao;
                        loteOrdemBE.NumeroSequenciaOrdem = item.Ordem.NumeroOrdem;
                        loteOrdemBE.NumeroSubSequenciaOrdem = item.Ordem.NumeroOrdemSubSequencia;
                        loteOrdemBE.DataOrdem = item.Ordem.DataOrdem;

                        loteOrdemBEList.Add(loteOrdemBE);
                    }

                    entity.NumeroConjunto = loteOrdem.CriarLoteOrdem(loteOrdemBEList);

                    this.InserirDigitacaoDistribuicao(entity);
                }

            }
            else
            { 
                BusinessException ex = new BusinessException(109591);
                throw ex;
            }
        }

        /// <summary>
        /// Realiza a alocação automática para a venda descoberta
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public void CalcularAlocacaoAutomatica(ref BusinessEntity.VendaDescoberta entity)
        {
            // Calculando alocacao automatica na ordem correta
            this.AlocarCarteira219(ref entity);    

            this.AlocarCarteira239(ref entity);
            
            this.AlocarCarteira280(ref entity);
            
            this.AlocarCarteira274(ref entity);
        }

        /// <summary>
        /// Carrega nas vendas descobertas as posições para cliente/ativo das carteiras Conta Margem (219), Garantia (239), BTC (280) e Opção 274
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public void CarregarPosicoesCarteiras(ref List<BusinessEntity.VendaDescoberta> vendasDescobertas)
        {
            foreach (BusinessEntity.VendaDescoberta item in vendasDescobertas)
            {
                ResourceAccess.AlocacaoCarteiraVendaDescoberta raAlocacao = new Sinacor.Servico.Bovespa.Alocacao.ResourceAccess.AlocacaoCarteiraVendaDescoberta();
                BusinessEntity.Parameter.FiltroPosicao beFiltroPosicao = new Sinacor.Servico.Bovespa.Alocacao.BusinessEntity.Parameter.FiltroPosicao();
                BusinessEntity.VendaDescoberta beVendas = new VendaDescoberta ();

                beFiltroPosicao.Cliente = item.Cliente;
                beFiltroPosicao.Ativo = item.Ativo;

                beVendas = raAlocacao.ObterPosicoes(beFiltroPosicao);

                if (beVendas != null)
                {
                    item.PosicaoCarteira219  = beVendas.PosicaoCarteira219 ;
                    item.PosicaoCarteira239 = beVendas.PosicaoCarteira239 ;
                    item.PosicaoCarteira274 = beVendas.PosicaoCarteira274 ;
                    item.PosicaoCarteira280 = beVendas.PosicaoCarteira280 ;
                }
            }
        }

        /// <summary>
        /// Consulta vendas de ativos dos clientes com quantidade descoberta na Carteira Geral (216/21016), a consulta inclusive já traz a posição nas carteiras 219,280,239,274. Caso o parâmetro de entrada SugerirAlocacaoAutomatica esteja configurado como verdadeiro o sistema irá sugerir uma alocação das vendas descobertas entre as carteiras 
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public List<BusinessEntity.VendaDescoberta> ConsultarVendasDescobertas(BusinessEntity.Parameter.FiltroVendaDescoberta parameter)
        {
            List<BusinessEntity.VendaDescoberta> vendasDescobertas = new List<VendaDescoberta>();

            if (parameter == null)
            {
                BusinessException ex = new BusinessException(109591);
                throw ex;
            }
            else
            {
                this.ValidarPermissaoAcesso();

                Operador.BusinessEntity.Parameter.FiltroOperador filtroOperador = new Operador.BusinessEntity.Parameter.FiltroOperador();
                Operador.BusinessLogic.Operador operador = new Operador.BusinessLogic.Operador();

                ResourceAccess.AlocacaoCarteiraVendaDescoberta alocacaoCarteiraRA = new Sinacor.Servico.Bovespa.Alocacao.ResourceAccess.AlocacaoCarteiraVendaDescoberta();

                filtroOperador.CodigoOperador = AuthorizationContext.Current.UserId;
                List<Sinacor.Servico.Bovespa.Operador.BusinessEntity.Operador> retornoOperador = operador.ConsultarOperadores(filtroOperador);

                int cont = -1;
                List<int> indices = new List<int>();

                if (retornoOperador != null || retornoOperador.Count == 0)
                {
                    ResourceAccess.AlocacaoCarteiraVendaDescoberta alocacaoRA = new Sinacor.Servico.Bovespa.Alocacao.ResourceAccess.AlocacaoCarteiraVendaDescoberta();

                    vendasDescobertas = alocacaoRA.ConsultarVendasDescobertas216(parameter);

                    if (vendasDescobertas.Count > 0)
                    {
                        foreach (BusinessEntity.VendaDescoberta item in vendasDescobertas)
                        {
                            cont = cont + 1;

                            if (item.QuantidadeDescoberta < 0)
                            {
                                BusinessEntity.Posicao posicao = new Posicao();
                                BusinessEntity.Parameter.FiltroPosicao filtroPosicao = new Sinacor.Servico.Bovespa.Alocacao.BusinessEntity.Parameter.FiltroPosicao();
                                filtroPosicao.Ativo = item.Ativo;
                                filtroPosicao.Cliente = item.Cliente;

                                posicao = alocacaoCarteiraRA.ObterPosicao216(filtroPosicao);

                                item.QuantidadeDescoberta += posicao.Quantidade;
                                item.QuantidadeNaoAlocada = item.QuantidadeDescoberta * -1;

                                if (!(item.QuantidadeDescoberta < 0))
                                {
                                    indices.Add(cont);
                                }
                            }
                            else
                            {
                                indices.Add(cont);
                            }
                        }
                    }

                    foreach (var item in indices.OrderByDescending(x => x))
                    {
                        vendasDescobertas.RemoveAt(item);
                    }


                    ExcluirAtivosEX(ref vendasDescobertas);

                    CarregarPosicoesCarteiras(ref vendasDescobertas);

                    foreach (VendaDescoberta item in vendasDescobertas)
                    {
                        VendaDescoberta itemVenda = item;
                        itemVenda.QuantidadeDescoberta = itemVenda.QuantidadeDescoberta * -1;
                        if (parameter.SugerirAlocacaoAutomatica == true)
                            CalcularAlocacaoAutomatica(ref itemVenda);
                    }
                }
            }
           
            return vendasDescobertas;
        }
        /// <summary>
        /// Remover as vendas descobertas que possuem ativos EX
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public void ExcluirAtivosEX(ref List<BusinessEntity.VendaDescoberta> vendasDescobertas)
        {
            vendasDescobertas.Select(Ativos => new
            {
                ativosFiltrados = Ativos.Ativo

            }).Distinct();

            int cont = -1;
            List<int> indices = new List<int>();

            foreach (BusinessEntity.VendaDescoberta item in vendasDescobertas)
            {
                cont = cont + 1;
                Titulo.BusinessLogic.Titulo titulo = new Sinacor.Servico.Bovespa.Titulo.BusinessLogic.Titulo();
                Titulo.BusinessEntity.Titulo tituloBE = new Sinacor.Servico.Bovespa.Titulo.BusinessEntity.Titulo();
                Titulo.BusinessEntity.Titulo tituloRetornoBE = new Sinacor.Servico.Bovespa.Titulo.BusinessEntity.Titulo();

                tituloBE.Codigo = item.Ativo;
                tituloBE.DataOrdem = item.DataPregao;

                tituloRetornoBE = titulo.ObterTitulo(tituloBE);

                ResourceAccess.AlocacaoCarteiraVendaDescoberta alocacaoRA = new Sinacor.Servico.Bovespa.Alocacao.ResourceAccess.AlocacaoCarteiraVendaDescoberta();
                BusinessEntity.Resultado resultado = new Sinacor.Servico.Bovespa.Alocacao.BusinessEntity.Resultado();
                resultado = alocacaoRA.ValidarAtivoEX(tituloRetornoBE);

                if (resultado.Valor != null)
                {
                    if (Convert.ToBoolean(resultado.Valor) == true)
                    {
                        indices.Add(cont);
                    }
                }
            }

            foreach (var item in indices.OrderByDescending(x => x))
            {
                vendasDescobertas.RemoveAt(item);
            } 
        }

        /// <summary>
        /// Prepara a venda descoberta em registros de distribuição
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public void InserirDigitacaoDistribuicao(BusinessEntity.VendaDescoberta entity)
        {
            Bovespa.Cliente.BusinessLogic.Cliente cliente = new Sinacor.Servico.Bovespa.Cliente.BusinessLogic.Cliente();            
            Bovespa.Cliente.BusinessEntity.Cliente clienteBE = new Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Cliente();

            Bovespa.Cliente.BusinessEntity.Parameter.FiltroCliente clienteFiltroBE = new Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Parameter.FiltroCliente();
            clienteFiltroBE.Codigo = entity.Cliente;

            clienteBE = cliente.ObterCliente(clienteFiltroBE);

            Ordens.BusinessLogic.LoteDigitacao loteDigitacao = new Sinacor.Servico.Bovespa.Ordens.BusinessLogic.LoteDigitacao();
            Ordens.BusinessEntity.LoteDigitacao loteDigitacaoBE = new Sinacor.Servico.Bovespa.Ordens.BusinessEntity.LoteDigitacao();
            List<Ordens.BusinessEntity.LoteDigitacao> loteDigitacaoList = new List<Sinacor.Servico.Bovespa.Ordens.BusinessEntity.LoteDigitacao>();

            loteDigitacaoBE.NumeroConjunto = entity.NumeroConjunto.Value;
            loteDigitacaoBE.DataMovimento = entity.DataPregao;
            loteDigitacaoBE.CodigoCliente = entity.Cliente;
            loteDigitacaoBE.DigitoVerificadorCliente = clienteBE.Digito;
            loteDigitacaoBE.ValorDolar = 1;
            loteDigitacaoBE.IndicadorNaoLiquidacao = "N";
            loteDigitacaoBE.TipoDistribuicao = Ordens.BusinessEntity.Enum.TipoDistribuicao.PrecoMedioPorVolume;
            if (clienteBE.PercentualTotal != 0)
                loteDigitacaoBE.PercentualAcrescimo = clienteBE.PercentualTotal;
            else
                loteDigitacaoBE.PercentualAcrescimo = clienteBE.PercentualReducaoAcrescimo;

            loteDigitacaoList.Add(loteDigitacaoBE);

            Func<bool> has219 = () => { return entity.AlocacaoCarteira219 != null && entity.AlocacaoCarteira219 != 0; };
            if (has219())
            {
                loteDigitacaoBE.QuantidadeDestinadaCliente = entity.AlocacaoCarteira219;
                loteDigitacaoBE.CodigoCarteira = 219;
                loteDigitacao.Inserir(loteDigitacaoList);
            }

            Func<bool> has280 = () => { return entity.AlocacaoCarteira280 != null && entity.AlocacaoCarteira280 != 0; };
            if (has280())
            {
                loteDigitacaoBE.QuantidadeDestinadaCliente = entity.AlocacaoCarteira280;
                loteDigitacaoBE.CodigoCarteira = 280;
                loteDigitacao.Inserir(loteDigitacaoList);
            }

            Func<bool> has239 = () => { return entity.AlocacaoCarteira239 != null && entity.AlocacaoCarteira239 != 0; };
            if (has239())
            {
                loteDigitacaoBE.QuantidadeDestinadaCliente = entity.AlocacaoCarteira239;
                loteDigitacaoBE.CodigoCarteira = 239;
                loteDigitacao.Inserir(loteDigitacaoList);
            }

            Func<bool> has274 = () => { return entity.AlocacaoCarteira274 != null && entity.AlocacaoCarteira274 != 0; };
            if (has274())
            {
                loteDigitacaoBE.QuantidadeDestinadaCliente = entity.AlocacaoCarteira274;
                loteDigitacaoBE.CodigoCarteira = 274;
                loteDigitacao.Inserir(loteDigitacaoList);
            }

            if (has219() || has280() || has239() || has274())
            {
                // Inserir resto do saldo na carteira 216
                loteDigitacaoBE.CodigoCarteira = 216;
                loteDigitacaoBE.QuantidadeDestinadaCliente = entity.QuantidadeTotal.GetValueOrDefault() -
                    (entity.AlocacaoCarteira219.GetValueOrDefault() +
                    entity.AlocacaoCarteira280.GetValueOrDefault() +
                    entity.AlocacaoCarteira239.GetValueOrDefault() +
                    entity.AlocacaoCarteira274.GetValueOrDefault());

                if (loteDigitacaoBE.QuantidadeDestinadaCliente > 0)
                    loteDigitacao.Inserir(loteDigitacaoList);
            }

        }

        /// <summary>
        /// Informa a situação dos lotes de ordem para uma venda descoberta
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public Sinacor.Servico.Bovespa.Alocacao.BusinessEntity.Enum.SituacaoLoteOrdemVendaDescoberta ObterSituacaoLoteOrdemVendaDescoberta(BusinessEntity.VendaDescoberta parameter)
        {
            ResourceAccess.AlocacaoCarteiraVendaDescoberta alocacaoCarteiraRA = new Sinacor.Servico.Bovespa.Alocacao.ResourceAccess.AlocacaoCarteiraVendaDescoberta();
            _lotesOrdensVendaDescoberta = alocacaoCarteiraRA.ConsultarLotesVendaDescoberta(parameter);

            if (_lotesOrdensVendaDescoberta.Count == 0)
            {
                return Sinacor.Servico.Bovespa.Alocacao.BusinessEntity.Enum.SituacaoLoteOrdemVendaDescoberta.NaoExisteLote;
            }
            else
            {

                _lotesOrdensVendaDescoberta.Select(VendaDescoberta => new
                {
                    _lotesOrdensVendaDescoberta = VendaDescoberta.NumeroConjunto
                }).Distinct();

                if (_lotesOrdensVendaDescoberta.Count == 1)
                {
                    return Sinacor.Servico.Bovespa.Alocacao.BusinessEntity.Enum.SituacaoLoteOrdemVendaDescoberta.ExisteApenasUmLote;
                }
                else
                {
                    return Sinacor.Servico.Bovespa.Alocacao.BusinessEntity.Enum.SituacaoLoteOrdemVendaDescoberta.ExisteDiversosLotes;
                }
            }

        }

        /// <summary>
        /// Trata exceções geradas em functions e procedures do oracle
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public void TratarExcecoes(BusinessEntity.Resultado entity)
        {
            List<Object> _params;

            _params = ErrorMessage.ConvertXmlArgumentsToParameters(entity.Argumentos);

            if (string.IsNullOrEmpty(entity.Argumentos))
                throw new BusinessException(entity.CodigoErro);
            else
                throw new BusinessException(entity.CodigoErro, _params.ToArray());
        }

        /// <summary>
        /// Valida se o estado do movimento é aberto
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public void ValidarEstadoMovimento()
        {
            Bovespa.Movimento.BusinessLogic.ControleMovimentoOrdens movimentoControleMovOrdens = new ControleMovimentoOrdens();
            Bovespa.Movimento.BusinessEntity.DataMovimento dataMovimento = new DataMovimento();
            Bovespa.Movimento.BusinessEntity.EstadoMovimento estadoMovimento = new EstadoMovimento();
            movimentoControleMovOrdens.ObterInformacoesMovimento(dataMovimento);

            if (estadoMovimento.Estado != Movimento.BusinessEntity.Enum.TipoMovimento.Aberto)
            {
                throw new BusinessException(109590);
            }
            
        }

        /// <summary>
        /// Valida se o estado do movimento é aberto
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="qtdeOperacaoTermo"></param>
        public void ValidarPermissaoAcesso()
        {
            if ((new Sinacor.Servico.Bovespa.Acesso.BusinessLogic.Acesso()).VerificarSistemaInstalado("CF"))
            {
                Operador.BusinessLogic.Operador operadorBL = new Sinacor.Servico.Bovespa.Operador.BusinessLogic.Operador();
                Operador.BusinessEntity.Parameter.FiltroOperador filtroOperador = new Sinacor.Servico.Bovespa.Operador.BusinessEntity.Parameter.FiltroOperador();
                List<Operador.BusinessEntity.Operador> operadores = new List<Sinacor.Servico.Bovespa.Operador.BusinessEntity.Operador>();

                filtroOperador.CodigoOperador = AuthorizationContext.Current.UserId;

                operadores = operadorBL.ConsultarOperadores(filtroOperador);

                if ((operadores != null) && (operadores.Count > 0))
                { 
                    if(!(AuthorizationContext.Current.CheckUserAccess("MONC", "ORD")))
                    {
                        throw new BusinessException(109587);
                    }
                }
                else
                {
                    throw new BusinessException(109587);
                }
            }
            else
            {
                throw new BusinessException(109587);
            }

        }

        #endregion Métodos
    }
}